import axios from "axios"
import instance from "@/api/axios"
import axiosOptimize from "vue-axios-optimize"
import store from "@/store"
import {MessageBox} from "element-ui"
import {decryptObj} from "vue2-element-admin-plugin"

let isAlertShowing = false // 是否弹出messaBox.alert
// https://www.npmjs.com/package/vue-axios-optimize
// https://mp.weixin.qq.com/s?__biz=MzUyMjkxNDc3Mg==&mid=2247484964&idx=1&sn=3cbd0fdcd5f8877acd1179df96fa5776&chksm=f9c5d89fceb2518917cb2e313d2b302a335f70ebf4999d570484b697264f1353d66730fff961&scene=126#rd
const AxiosOptimize = new axiosOptimize(axios, instance, {
  maxReqNum: 2, // 同时最多请求数量 选配  默认 6
  cacheNum: 2, // 缓存数量 选配  默认10
  responseTypesStr: "arraybuffer,blob", // 当axios请求设置 responseType为arraybuffer或blob时，直接返回原始数据 选配 
  showLoadingFun: (config, requestingNum) => { // 当需要加载动画的请求数量不为0时的回调函数
    store.commit("app/SET_LOADING_STATUS", true)
  },
  hideLoadingFun: (config, requestingNum) => { // 当需要加载动画的请求数量为0时的回调函数
    store.commit("app/SET_LOADING_STATUS", false)
  },
  responseResultFun: (res) => { // 响应数据格式化
    let data = res.data
    // 通过相应数据是否有此字段判断是否是加密数据
    if (data.data) {
      data = decryptObj(data.data)
    }
    return data
  },
  openRefresh: true, // 是否开启无感知刷新token 以下配置均与无感知刷新token有关 如无需配置无感知刷新token 可忽略
  code: "code", // 判断响应码的字段标识  默认code
  authorizationKey: "Authorization", // headers存放accessToken的字段名 默认 accessToken 用于判断当前接口是否使用的最新的token
  accessTokenExpirationCode: 401, // accessToken过期时 接口响应状态码 默认 数字类型 401
  refreshTokenExpirationCode: 403, // 刷新token接口请求报错时的 响应状态码  默认 数字类型 403
  setAuthorizationFun: (config, authorization) => { // 设置接口请求token的 并返回新的config 默认为 config.headers.Authorization = "Bearer " + accessToken
    config.headers.Authorization = authorization
    return config
  },
  getRefreshTokenFun: () => { // 获取refreshToken的方法
    return store.getters.refreshToken
  },
  getAuthorizationFun: () => { // 获取Authorization的方法
    return "Bearer " + store.getters.accessToken
  },
  refreshTokenStore: (refreshToken) => { // 调用刷新token的方法 并将获取到的数据存储到cookie 且需要将接口返回的数据  resolve(data)
    return store.dispatch("user/refreshToken", refreshToken)
  },
  reloginFun: async(response) => { // 刷新token接口也报错后的处理逻辑 建议进行类似如下方法处理
    if (isAlertShowing) {
      return
    }
    isAlertShowing = true
    // 重新登录方法   弹框提示 点击确认后 建议清除 缓存中token等信息后 刷新页面
    MessageBox.alert(`${response.message}`, "提示", {
      confirmButtonText: "OK",
      showClose: false,
      callback: async(action) => {
        isAlertShowing = false
        if (action === "confirm") {
          // 清除缓存中的token等信息
          store.commit("user/CLEAR_AUTH")
          // 刷新浏览器是为了 跳转登录页时query的redirect 会带上 当前页面地址（路由拦截处的逻辑）
          window.location.reload()
        }
      }
    })
  }
})

export default AxiosOptimize